Vector
Vector(C++)
Vector是一个封装了动态大小数组的顺序*容器,即一个可以存放任意类型的动态数组。
¶容器特性
¶顺序存储
顺序容器中的元素线性排列,通过元素在序列中的位置访问元素。
¶动态数组
支持对序列中的元素进行快速访问,在序列末尾快速增删元素。
¶感知内存分配器的Alloctor-aware
内存分配器(Memory Alloctor)
通常使用的内存分配器,即malloc/free函数并非系统提供的,而是C标准库提供的。也被称为动态内存分配器。
目的
:平衡内存分配的性能和提高内存使用的效率。
内存不足的原因
:程序内的bug;系统内存不足;内存分配浪费大量空间,导致大量内存碎片。
Alloctor Aware Container
所有的STL容器,都保存一个或默认,或由用户提供的allocator的实例,用来提供对象内存分配和构造的方法(除了std::array),这样的容器,被称作Allocator Aware Container。
Allocator Aware Container的拷贝:
调用被拷贝对象的std::allocator_traits
拷贝对象调用静态的propagate_on_container_copy_assignment,获取被拷贝容器的allocator副本,避免出现直接拷贝容器的bug。
每一个std::allocator_traits
对于拷贝赋值(copy assignment),需要运行时判断容器的propagate_on_copy_assignement trait,如果为true,并且两个容器不相等,那么lhs的容器应该先析构所有内存,再拷贝allocator,最后执行对象的拷贝。
容器在移动赋值(move assignment)的时候需要考虑如下情况,来正确操作容器的allocator:
- propagate_on_container_move_assignemnt 为 true_type
lhs拷贝容器使用alloctor释放分配内存,rhs被拷贝者alloctor所有权转移,内存的所有权从rhs转移到lhs。 - propagate_on_container_move_assignemnt 为 false_type,但两个allocator相等
lhs拷贝容器使用alloctor释放分配内存,不交换所有权。 - propagete_on_container_move_assignment 为 false_type,两个allocator
不等无法执行内存级别的移动,只能进行对象级别的移动。
¶函数实现
¶构造函数
1 | vector() //创建一个空vector |
¶增加函数
1 | void push_back(const T& x) //向量尾部增加一个元素X |
¶删除函数
1 | iterator erase(iterator it) //删除向量中迭代器指向元素 |
¶遍历函数
1 | reference at(int pos) //返回pos位置元素的引用 |
¶判空
1 | bool empty() const //判断向量是否为空,若为空,则向量中无元素 |
¶大小函数
1 | int size() const //返回向量中元素的个数 |
¶7.其他函数
1 | void swap(vector&) //交换两个同类型向量的数据 |
¶使用
1 |
|
- Vector<类型>标识符
- Vector<类型>标识符(最大容量)
- Vector<类型>标识符(最大容量,初始所有值)
- Int i[5]={1,2,3,4,5}
Vector<类型>vi(I,i+2);//得到i索引值为3以后的值 - Vector< vector< int> >v;